package com.charm.restaurant.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.charm.restaurant.common.Result;
import com.charm.restaurant.dto.LoginDTO;
import com.charm.restaurant.entity.User;
import com.charm.restaurant.mapper.UserMapper;
import com.charm.restaurant.service.UserService;
import com.charm.restaurant.vo.UserVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import java.nio.charset.StandardCharsets;
import java.util.UUID;

/**
 * 用户服务实现类
 */
@Slf4j
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    /**
     * 用户登录
     */
    @Override
    public Result<UserVO> login(LoginDTO loginDTO) {
        // 1. 根据用户名查询用户
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(User::getUsername, loginDTO.getUsername());
        User user = this.getOne(queryWrapper);

        // 2. 判断用户是否存在
        if (user == null) {
            return Result.error("用户名不存在");
        }

        // 3. 密码比对
        String password = DigestUtils.md5DigestAsHex(loginDTO.getPassword().getBytes(StandardCharsets.UTF_8));
        if (!user.getPassword().equals(password)) {
            return Result.error("密码错误");
        }

        // 4. 判断用户状态
        if (user.getStatus() == 0) {
            return Result.error("账号已禁用");
        }

        // 5. 生成token
        String token = UUID.randomUUID().toString();

        // 6. 返回用户信息
        UserVO userVO = new UserVO();
        BeanUtils.copyProperties(user, userVO);
        userVO.setToken(token);

        return Result.success(userVO);
    }

    /**
     * 用户注册
     */
    @Override
    public Result<UserVO> register(User user) {
        // 1. 判断用户名是否已存在
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(User::getUsername, user.getUsername());
        User existUser = this.getOne(queryWrapper);
        if (existUser != null) {
            return Result.error("用户名已存在");
        }

        // 2. 密码加密
        String password = DigestUtils.md5DigestAsHex(user.getPassword().getBytes(StandardCharsets.UTF_8));
        user.setPassword(password);

        // 3. 设置默认值
        user.setStatus(1);
        user.setDeleted(0);

        // 4. 保存用户
        this.save(user);

        // 5. 生成token
        String token = UUID.randomUUID().toString();

        // 6. 返回用户信息
        UserVO userVO = new UserVO();
        BeanUtils.copyProperties(user, userVO);
        userVO.setToken(token);

        return Result.success(userVO);
    }

    /**
     * 获取用户信息
     */
    @Override
    public Result<UserVO> getUserInfo() {
        // 模拟获取当前登录用户ID
        Long userId = 1L;

        // 查询用户信息
        User user = this.getById(userId);
        if (user == null) {
            return Result.error("用户不存在");
        }

        // 返回用户信息
        UserVO userVO = new UserVO();
        BeanUtils.copyProperties(user, userVO);

        return Result.success(userVO);
    }

    /**
     * 修改用户信息
     */
    @Override
    public Result<UserVO> updateInfo(User user) {
        // 模拟获取当前登录用户ID
        Long userId = 1L;
        user.setId(userId);

        // 不允许修改密码
        user.setPassword(null);

        // 更新用户信息
        this.updateById(user);

        // 查询最新用户信息
        User updatedUser = this.getById(userId);

        // 返回用户信息
        UserVO userVO = new UserVO();
        BeanUtils.copyProperties(updatedUser, userVO);

        return Result.success(userVO);
    }

    /**
     * 修改密码
     */
    @Override
    public Result<String> updatePassword(String oldPassword, String newPassword) {
        // 从localStorage获取当前登录用户信息
        // 实际项目中应该从JWT或Session中获取用户ID
        Long userId = 1L;

        log.info("修改密码，用户ID：{}", userId);

        // 查询用户信息
        User user = this.getById(userId);
        if (user == null) {
            return Result.error("用户不存在");
        }

        // 校验旧密码
        String oldPasswordMd5 = DigestUtils.md5DigestAsHex(oldPassword.getBytes(StandardCharsets.UTF_8));
        if (!user.getPassword().equals(oldPasswordMd5)) {
            log.warn("旧密码错误，用户ID：{}", userId);
            return Result.error("旧密码错误");
        }

        // 更新密码
        String newPasswordMd5 = DigestUtils.md5DigestAsHex(newPassword.getBytes(StandardCharsets.UTF_8));
        user.setPassword(newPasswordMd5);
        boolean updated = this.updateById(user);

        if (!updated) {
            log.error("密码更新失败，用户ID：{}", userId);
            return Result.error("密码修改失败");
        }

        log.info("密码修改成功，用户ID：{}", userId);
        return Result.success("密码修改成功");
    }
}
